package com.gitee.wsl.time.chinese

import com.gitee.wsl.time.chinese.util.SolarUtil.getDaysOfMonth
import com.gitee.wsl.time.now
import kotlinx.datetime.LocalDate
import kotlin.jvm.JvmOverloads
import kotlin.math.abs


/**
 * 阳历月
 *
 * @author 6tail
 */
class SolarMonth {
    /**
     * 年
     */
    val year: Int
    /**
     * 月
     */
    val month: Int

    /**
     * 通过日期初始化
     */
    @JvmOverloads
    constructor(date: LocalDate = LocalDate.now()) {
        val solar: Solar = Solar.fromDate(date)
        year = solar.year
        month = solar.month
    }

    /**
     * 通过年月初始化
     *
     * @param year  年
     * @param month 月
     */
    constructor(year: Int, month: Int) {
        this.year = year
        this.month = month
    }

    val days: List<Solar>
        /**
         * 获取本月的阳历日期列表
         *
         * @return 阳历日期列表
         */
        get() {
            val l = ArrayList<Solar>(31)
            val d= Solar(year, month, 1)
            l.add(d)
            val days = getDaysOfMonth(year, month)
            for (i in 1..<days) {
                l.add(d.next(i))
            }
            return l
        }

    /**
     * 获取本月的阳历周列表
     * @param start 星期几作为一周的开始，1234560分别代表星期一至星期天
     * @return 周列表
     */
    fun getWeeks(start: Int): List<SolarWeek> {
        val l = ArrayList<SolarWeek>()
        var week: SolarWeek = SolarWeek.fromYmd(year, month, 1, start)
        while (true) {
            l.add(week)
            week = week.next(1, false)
            val firstDay: Solar = week.firstDay
            if (firstDay.year > year || firstDay.month > month) {
                break
            }
        }
        return l
    }

    /**
     * 获取往后推几个月的阳历月，如果要往前推，则月数用负数
     *
     * @param months 月数
     * @return 阳历月
     */
    fun next(months: Int): SolarMonth {
        val n = if (months < 0) -1 else 1
        var m = abs(months)
        var y = year + m / 12 * n
        m = month + m % 12 * n
        if (m > 12) {
            m -= 12
            y++
        } else if (m < 1) {
            m += 12
            y--
        }
        return SolarMonth(y, m)
    }

    override fun toString(): String {
        return "$year-$month"
    }

    fun toFullString(): String {
        return year.toString() + "年" + month + "月"
    }

    companion object {
        /**
         * 通过指定日期获取阳历月
         *
         * @param date 日期
         * @return 阳历月
         */
        fun fromDate(date: LocalDate): SolarMonth {
            return SolarMonth(date)
        }


        /**
         * 通过指定年月获取阳历月
         *
         * @param year  年
         * @param month 月
         * @return 阳历月
         */
        fun fromYm(year: Int, month: Int): SolarMonth {
            return SolarMonth(year, month)
        }
    }
}
